<?php

use Illuminate\Database\Seeder;
use App\Models\User;

class UsersTableSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        // 获取 Faker 实例
        $faker = app(Faker\Generator::class);

        // 头像假数据
        $avatars = [
            'https://cdn.learnku.com/uploads/images/201710/14/1/s5ehp11z6s.png',
            'https://cdn.learnku.com/uploads/images/201710/14/1/Lhd1SHqu86.png',
            'https://cdn.learnku.com/uploads/images/201710/14/1/LOnMrqbHJn.png',
            'https://cdn.learnku.com/uploads/images/201710/14/1/xAuDMxteQy.png',
            'https://cdn.learnku.com/uploads/images/201710/14/1/ZqM7iaP4CR.png',
            'https://cdn.learnku.com/uploads/images/201710/14/1/NDnzMutoxX.png',
        ];

        // 生成数据集合
        /**
         * factory(User::class) 根据指定的 User 生成模型工厂构造器，
         *   对应加载 UserFactory.php 中的工厂设置
         * times(10) 指定生成模型的数量
         * make() 方法会将结果生成为 集合对象
         * use 是 PHP 中匿名函数提供的本地变量传递机制，
         *   匿名函数中必须通过 use 声明的引用，才能使用本地变量
         * makeVisible() 是 Eloquent 对象提供的方法，
         *   可以显示 User 模型 $hidden 属性里指定隐藏的字段，
         *   此操作确保入库时数据库不会报错
         */
        $users = factory(User::class)
                        ->times(10)
                        ->make()
                        ->each(function ($user, $index)
                            use ($faker, $avatars)
        {
            // 从头像数组中随机取出一个并赋值
            $user->avatar = $faker->randomElement($avatars);
        });

        // 让隐藏字段可见，并将数据集合转换为数组
        $user_array = $users->makeVisible(['password', 'remember_token'])->toArray();

        // 插入到数据库中
        User::insert($user_array);

        // 定制 1 号用户
        $user = User::find(1);
        $user->name = 'Ling';
        $user->email = 'ling@hrs.com';
        $user->password = bcrypt('12345678');
        $user->avatar = 'https://cdn.learnku.com/uploads/images/201710/14/1/ZqM7iaP4CR.png';
        // 初始化用户角色，将 1 号用户指派为『站长』
        $user->assignRole('Founder');
        $user->save();

        // 定制 2 号用户
        $user = User::find(2);
        $user->name = 'Hrs';
        $user->email = 'hrsg@ling.com';
        $user->password = bcrypt('12345678');
        // 将 2 号用户指派为『管理员』
        $user->assignRole('Maintainer');
        $user->save();
    }
}
